Oop 使用factory和builder创建复杂类
背景: 我为网上购物建立了一个类图。 为了创建两种类型(golden user和silver user)的用户界面,我使用factory模式。Oop 使用factory和builder创建复杂类,oop,design-patterns,class-design,class-diagram,Oop,Design Patterns,Class Design,Class Diagram,背景: 我为网上购物建立了一个类图。 为了创建两种类型(golden user和silver user)的用户界面,我使用factory模式。 但是用户类变得非常复杂 如何通过bulider创建这个类?另一方面,指定用户类型(如工厂)的能力将保留在类名上 (将帮助我通过多态性而不是if&else来识别哪种类型)在这种特殊情况下,您不应该使用Factory创建同一类的不同实例。它可以用来创建一个公共抽象的不同实现。尝试实现IUser接口。然后通过两个类实现这个接口:GoldenUser和Silve
但是用户类变得非常复杂 如何通过bulider创建这个类?另一方面,指定用户类型(如工厂)的能力将保留在类名上
(将帮助我通过多态性而不是if&else来识别哪种类型)在这种特殊情况下,您不应该使用Factory创建同一类的不同实例。它可以用来创建一个公共抽象的不同实现。尝试实现IUser接口。然后通过两个类实现这个接口:GoldenUser和SilverUser。您的工厂将创建GoldenUser或SilverUser的实例,并将其作为IUser返回。此外,您还可以创建用户抽象类来代替接口IUser,该类将由GoldenUser和SilverUser继承。这两种模式的意图是不同的:当Factory创建一个对象实例时(可以容纳更多其他类实例)构建器的目标是逐步创建对象并减少重载构造函数。 例如(使用java代码片段): 工厂方法 用户界面:
public interface User {
}
GoldUser类:
class GoldUser implements User {
// ... field declarations
// Ctor
GoldUser(fields...){}
// ... methods
}
SilverUser类:
class SilverUser implement User {
// ... field declarations
// Ctor
SilverUser(fields...){}
// ... methods
}
用户工厂类:
public class UserFactory {
// ... user versions
public static int GoldUser = 0;
public static int SilverUser = 1;
// ... private Ctor because we don't want to instantiate this class - only in this example
private UserFactory (){}
// ... creating appropriate User instance
public static User createUser(int userType){
switch (userType){
case GoldUser: return new GoldUser;
case SilverUser: return new SilverUser;
default throw new WrongUserTypeException("Wrong User Type");
}
}
}
在你的另一节课上:
// ... code stuff here
User user=UserFactory.createUser(1); // will return new SilverUser instance
// ... other code stuff here
构建器模式
如果类中有许多字段,并且其中只有一些字段是必需的,则不必创建许多构造函数,构建器就足以:
class UserBuilder{
private static Service_A serviceA; // required
private static Service_B serviceB; // required
private static Service_C serviceC;
private static Service_D serviceD;
private static Service_E serviceE;
// since this builder is singleton
private static UserBuilder builderInstance = new UserBuilder();
private UserBuilder () {};
public static UserBuilder getBuilderInstance (Service_A service_A, Service_B service_B){
serviceA = service_A;
serviceB = service_B;
serviceC = null;
serviceD = null;
serviceE = null;
return builderInstance;
}
public static UserBuilder addServiceC (Service_C service_C) {
serviceC = service_C;
return builderInstance;
}
public static UserBuilder addServiceD (Service_D service_D) {
serviceC = service_D;
return builderInstance;
}
public static UserBuilder addServiceE (Service_E service_E) {
serviceE = service_E;
return builderInstance;
}
public static User build(){
return new User (serviceA, ServiceB, ServiceC, ServiceD, ServiceE);
}
然后,您可以构建自定义用户:
UserBuilder aUserBuilder = UserBuilder.getBuilderInstance(aServiceA, aServiceB);
// ... other stuff
aUserBuilder.addServiceE(aServiceE);
///... more stuff
User aUser= aUSerBuilder.addServiceC(aServiceC)
.build(); // will return the fresh built User instance
希望我能帮助你!
当做
Cs装饰图案是一个简单的解决方案:
公共类主{
公共静态void main(字符串[]args){
用户silverUser=newuserdecorator(newsilveruser(“Kyriakos”、“Georgiopoulos”);
用户goldenUser=newuserdecorator(newgoldenuser(“goldenUser firstName”、“goldenUser lastName”);
User nullUser=newuserdecorator(null);
System.out.println(silverUser.firstName()+“”+silverUser.lastName()+”是“+silverUser.type());
System.out.println(goldenUser.firstName()+“”+goldenUser.lastName()+”是“+goldenUser.type());
System.out.println(nullUser.firstName()+“”+nullUser.lastName()+”是“+nullUser.type());
}
}
界面用户{
字符串firstName();
字符串lastName();
字符串类型();
}
类SilverUser实现用户{
私有最终字符串名;
私有最终字符串lastName;
SilverUser(字符串名、字符串名){
this.firstName=firstName;
this.lastName=lastName;
}
公共字符串firstName(){
返回名字;
}
公共字符串lastName(){
返回姓氏;
}
公共字符串类型(){
返回“SilverUser”;
}
}
类GoldenUser实现用户{
私有最终字符串名;
私有最终字符串lastName;
GoldenUser(stringfirstname,stringlastname){
this.firstName=firstName;
this.lastName=lastName;
}
公共字符串firstName(){
返回名字;
}
公共字符串lastName(){
返回姓氏;
}
公共字符串类型(){
返回“GoldenUser”;
}
}
类UserDecorator实现用户{
私有最终用户;
用户装饰器(用户){
this.user=用户;
}
公共字符串firstName(){
返回user!=null&&user.firstName()!=null&&user.firstName().length()>0?
user.firstName():“”;
}
公共字符串lastName(){
返回用户!=null&&user.lastName()!=null&&user.lastName().length()>0?
user.lastName():“”;
}
公共字符串类型(){
返回用户!=null?user.type():“NullPointerException”;
}
}
您能否提供示例代码,说明客户机代码如何调用这样的工厂/建筑商,更准确地描述问题所在,以及您迄今为止所做的尝试?