Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 使用factory和builder创建复杂类_Oop_Design Patterns_Class Design_Class Diagram - Fatal编程技术网

Oop 使用factory和builder创建复杂类

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

背景: 我为网上购物建立了一个类图。 为了创建两种类型(golden user和silver user)的用户界面,我使用factory模式。
但是用户类变得非常复杂

如何通过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”;
}

}
您能否提供示例代码,说明客户机代码如何调用这样的工厂/建筑商,更准确地描述问题所在,以及您迄今为止所做的尝试?